package mysql8学习.初级.第12章_MySQL数据类型精讲;

/**
 *
 * | **整数类型**  | **字节** | 有符号数取值范围                            | 无符号数取值范围       |
 * | ------------| --------| ---------------------------------------- | ---------------------- |
 * | TINYINT     | 1       | -128~127                                 | 0~255                  |
 * | SMALLINT    | 2       | -32768~32767                             | 0~65535                |
 * | MEDIUMINT   | 3       | -8388608~8388607                         | 0~16777215             |
 * | INT、INTEGER| 4       | -2147483648~2147483647                   | 0~4294967295           |
 * | BIGINT      | 8       | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
 *
 * UNSIGNED           | 无符号      表示这个数只能是个正数或0
 *
 * ZEROFILL           补0  ZEROFILL 自带 UNSIGNED
 * M:表示显示宽度，M的取值范围是(0, 255)。
 *      例如，int(5): 当数据宽度小于5位的时候在数字前面需要用字符填满宽度。
 *      该项功能需要配合“ZEROFILL”使用，表示用“0"填满宽度,否则指定显示宽度无效。
 *      如果设置了显示宽度，那么插入的数据宽度超过显示宽度限制，会不会截断或插入失败?
 *        答案:不会对插入的数据有任何影响，还是按照类型的实际宽度进行保存，
 *          即显示宽度与类型可以存储的值范围无关。
 *        从MySQL 8.0.17开始，整数数据类型不推荐使用显示宽度属性。
 *        整型数据类型可以在定义表结构时指定所需要的显示宽度，
 *        如果不指定,则系统为每一种类型指定默认的宽度值。
 *
 * 如
 *      CREATE TABLE test_int2(
 *      f1 INT,
 *      f2 INT(5),
 *      f3 INT(5) ZEROFILL
 *      )
 *
 *      ZEROFILL  默认会用UNSIGNED填充  即默认你的数只能是正数
 *      f1和f2完全一样   f3当f3的值小于五位(十进制)时  会填充0  如123  会显示00123  多了不影响
 *
 * TINYINT      : 一般用于枚举数据，比如系统设定取值范围很小且固定的场景。
 * SMALLINT     :可以用于较小范围的统计数据，比如统计工厂的固定资产库存数量等。
 * MEDIUMINT    :用于较大整数的计算,比如车站每日的客流量等。
 * INT、INTEGER :取值范围足够大，一般情况下不用考虑超限问题，用得最多。比如商品编号。
 * BIGINT       :只有当你处理特别巨大的整数时才会用到。比如双十一的交易量、
 *              大型门户网站点击量、证券公司衍生产品持仓等。
 *
 * 如何选择？
 * 在评估用哪种整数类型的时候，你需要考虑 存储空间 和 可靠性 的平衡问题：
 *      一方 面，用占用字节数少的整数类型可以节省存储空间；
 *      另一方面，要是为了节省存储空间， 使用的整数类型取值范围太小，
 *      一旦遇到超出取值范围的情况，就可能引起 系统错误 ，影响可靠性。
 *  举个例子，商品编号采用的数据类型是 INT。
 *      原因就在于，客户门店中流通的商品种类较多，而且，每天都有旧商品下架，新商品上架，这样不断迭代，日积月累。
 *      如果使用 SMALLINT 类型，虽然占用字节数比 INT 类型的整数少，但是却不能保证数据不会超出范围 65535。
 *      相反，使用 INT，就能确保有足够大的取值范围，不用担心数据超出范围影响可靠性的问题。
 *      你要注意的是，在实际工作中，系统故障产生的成本远远超过增加几个字段存储空间所产生的成本。
 *      因此，我建议你首先确保数据不会超过取值范围，在这个前提之下，再去考虑如何节省存储空间。
 *
 */
public class C_整数类型 {
    public static void main(String[] args) {

    }
}
